package com.thh.datamonitor.executor.dao;

import com.thh.common.exception.ServiceException;
import com.thh.datamonitor.dto.TmdTableDto;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * 数据库接口
 *
 * @author thh
 */
public interface TableInfoDao {
    List<TmdTableDto> queryList(Connection connection, String dbname, String tableName) throws SQLException;

    TmdTableDto selectOne(Connection connection, String dbname, String tableName) throws SQLException;

    String ddl(Connection connection, String dbName, String tableName) throws SQLException;

    String getPrimaryKey(Connection connection, String dbname, String tableName) throws Exception;

    List<Map<String, String>> queryColumns(String tableName);


    //如果你不使用连接池，一旦Connection关闭，数据库物理连接就被释放，所有相关Java资源也可以被GC回收了。
    //不过如果访问量大的话，打开的连接比较多，而GC又不会马上回收资源，对服务器来说造成的压力也是很大的。
    //但是如果你使用连接池，那么请注意，Connection关闭并不是物理关闭，只是归还连 接池，
    //所以PreparedStatement和ResultSet都被持有，并且实际占用相关的数据库的 游标资源
    //，在这种情况下，只要长期运行，往往就会报“游标超出数据库允许的最大 值”的错误，
    //导致程序无法正常访问数据库。 所以还是养成及时关闭三者的好习惯吧。
    //https://my.oschina.net/zchuanzhao/blog/512643
    default void close( Connection connection, PreparedStatement pstmt , ResultSet rs) {
        close(  pstmt ,  rs);
        close(connection);
    }

    // 获取ddl
    default void close( PreparedStatement pstmt , ResultSet rs)  {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

    default void close(Connection connection) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                throw new ServiceException("关闭连接失败！");
            }
        }
    }

}
